home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / networke / civ-0.000 / civ-0 / civ-0.3 / src / MsgQ.cc < prev    next >
C/C++ Source or Header  |  1995-11-14  |  3KB  |  154 lines

  1. #include "MsgQ.h"
  2. #include <string.h>
  3.  
  4. #ifdef MS_WIN
  5. #include <winsock.h>
  6. #else
  7. #include <sys/types.h>
  8. #include <netinet/in.h>
  9. #endif
  10.  
  11. #include "server.h"
  12. #include "defs.h"
  13. #include "move.h"
  14.  
  15. const long CommandId = 0xbadbeef;
  16.  
  17. MsgQ::~MsgQ()
  18. {
  19.   mesgl = mesgs;
  20.   while (mesgl) {
  21.     Msg m = mesgl.Delete();
  22.     delete m.buf;
  23.   }
  24. }
  25.  
  26. void operator<<(MsgQ &q, Msg m) {
  27.   q.mesgl.Insert(m); q.mesgl.Next(); ++q.count;
  28. }
  29.  
  30. int operator>>(MsgQ &q, Msg &m) {
  31.   if (q.count == 0) return 0;
  32.   --q.count;
  33.   m = q.mesgs.RemoveHead();
  34.   if (q.count == 0) q.mesgl = q.mesgs;
  35.   return 1;
  36. }
  37.  
  38. int operator>>(MsgQ &q, long &n)
  39. {
  40.   Msg m;
  41.   int ret;
  42.   if ((ret = q >> m)) {
  43.     n = ntohl(*(long *)m.buf);
  44.     delete m.buf;
  45.   }
  46.   return ret;
  47. }
  48.  
  49. int operator>>(MsgQ &q, int &n)
  50. {
  51.   Msg m;
  52.   int ret;
  53.   if ((ret = q >> m)) {
  54.     long l = ntohl(*(long *)m.buf);
  55.     delete m.buf;
  56.     n = l;
  57.   }
  58.   return ret;
  59. }
  60.  
  61. void operator<<(MsgQ &q, long n)
  62. {
  63.   long *buf = new long;
  64.   *buf = htonl(n);
  65.   q << Msg((char *)buf, sizeof(long));
  66. }
  67.  
  68. int operator>>(MsgQ &q, PieceMove &move)
  69. {
  70.   Msg m;
  71.   int ret;
  72.   if ((ret = q >> m)) {
  73.     memcpy((char *)&move, m.buf, sizeof(PieceMove));
  74.     move.HostOrder();
  75.     delete m.buf;
  76.   }
  77.   return ret;
  78. }
  79.  
  80. void operator<<(MsgQ &q, PieceMove move)
  81. {
  82.   PieceMove *ptr = new PieceMove(move);
  83.   ptr->NetworkOrder();
  84.   q << Msg((char *)ptr, sizeof(PieceMove));
  85. }
  86.  
  87. int operator>>(MsgQ &q, char *(&str))
  88. {
  89.   Msg m;
  90.   int ret;
  91.   if ((ret = q >> m))
  92.     str = m.buf;
  93.   return ret;
  94. }
  95.  
  96. void operator<<(MsgQ &q, char *str)
  97. {
  98.   q << Msg(strdup(str), strlen(str)+1);
  99. }
  100.  
  101. void operator<<(MsgQ &q, MsgQ &q1)
  102. {
  103.   Msg m;
  104.   while (q1 >> m)
  105.     q << m;
  106. }
  107.  
  108. int MsgQ::IsCmd(long &cmd, long &arg)
  109. {
  110.   if (Count() == 0) return 0;
  111.   Msg m;
  112.   PeekHead(m);
  113.   if (m.len != sizeof(long)*3) return 0;
  114.   long *buf = (long *)m.buf;
  115.   if (buf[0] != (long)htonl(CommandId)) return 0;
  116.   *this >> m;
  117.   cmd = ntohl(buf[1]);
  118.   arg = ntohl(buf[2]);
  119.   delete [] buf;
  120.   return 1;
  121. }
  122.  
  123. void MsgQ::AddCmd(long cmd, long arg)
  124. {
  125.   long *buf = new long[3];
  126.   buf[0] = htonl(CommandId);
  127.   buf[1] = htonl(cmd);
  128.   buf[2] = htonl(arg);
  129.   *this << Msg((char *)buf, sizeof(long)*3);
  130. }
  131.  
  132. MsgQ *MsgQ::Copy()
  133. {
  134.   MsgQ *q = new MsgQ;
  135.   Lister<Msg> lister = mesgs;
  136.   while (lister) {
  137.     Msg m = lister.Elem();
  138.     char *buf = new char[m.len];
  139.     memcpy(buf, m.buf, m.len);
  140.     *q << Msg(buf, m.len);
  141.     lister.Next();
  142.   }
  143.   return q;
  144. }
  145.  
  146. // send's a queue to the server
  147. void SendQ(MsgQ *q)
  148. {
  149.   if (playerId == 0) // we're the server
  150.     ServerGotData(q, -1, 0);
  151.   else // sock is the conn to the server
  152.     SendQ(sock, q);
  153. }
  154.